Loading tidyverse: tibble
Loading tidyverse: tidyr
Loading tidyverse: readr
Loading tidyverse: purrr
Loading tidyverse: dplyr
Conflicts with tidy packages ---------------------------------------------------------------------------------------------------------------
filter(): dplyr, stats
lag(): dplyr, stats
data.table 1.9.6 For help type ?data.table or https://github.com/Rdatatable/data.table/wiki
The fastest way to learn (by data.table authors): https://www.datacamp.com/courses/data-analysis-the-data-table-way
------------------------------------------------------------------------------------------------------------------------------------------
data.table + dplyr code now lives in dtplyr.
Please library(dtplyr)!
------------------------------------------------------------------------------------------------------------------------------------------
Attaching package: ‘data.table’
The following objects are masked from ‘package:dplyr’:
between, last
The following object is masked from ‘package:purrr’:
transpose
Eye
19 total normal eye RNA-seq studies collected
core_eye_info %>% group_by(study_accession, study_title) %>% summarise(Count = n()) %>% nrow()
[1] 19
Basic tabular info on the collected eye RNA-seq data
# Eye RNA-seq studies with the number of samples
core_eye_info %>% group_by(study_accession, study_title) %>% summarise(Count = n()) %>% formattable()
# Number of RPE, Retina, Cornea, etc. tissues, by source (Tissue or Cell Line)
core_eye_info %>% group_by(Tissue, Origin) %>% summarise(Count=n()) %>% formattable()
I want to see the relationships between the tissues. I expect to see retina and RPE as distinct clusters of tissues. Curious about where the cornea, eyelid, and ESCs (embryonic stem cells) end up. To judge the stability of the clustering, I’ve run through perplexities 5 to 50.
Perplexity 5 through 50
eye_only <- c('Retina','RPE','Cornea','ESC','EyeLid','Cornea')
plot <- long_tsne_plot %>% left_join(.,core_info) %>% filter(Tissue %in% eye_only) %>%
ggplot(.,aes(x=X1,y=X2,colour=Tissue,shape=study_accession,frame=perplexity)) +
geom_point(size=4) + scale_shape_manual(values=c(0:20)) +
ggtitle(paste0("t-sne. Perplexity = ")) +
theme_Publication()
Joining, by = "sample_accession"
gg_animate(plot)
So, retina and RPE largely stay apart. Though each has little outgroups. ESC, EyeLid, and Cornea tend to be with the RPE. Let’s try to see what each outgroup is.
Just perplexity 40:
long_tsne_plot %>% left_join(.,core_info) %>% filter(perplexity==40, Tissue %in% eye_only) %>%
ggplot(.,aes(x=X1,y=X2,colour=Tissue,shape=study_accession)) +
geom_point(size=4) + scale_shape_manual(values=c(0:20)) +
ggtitle(paste0("t-sne. Perplexity = ", 40)) +
theme_Publication()
Joining, by = "sample_accession"

OK, let’s colour by tissue source and only keep Retina and RPE:
long_tsne_plot %>% left_join(.,core_info) %>% filter(perplexity==40, Tissue %in% c('Retina','RPE')) %>%
ggplot(.,aes(x=X1,y=X2,colour=Origin,shape=study_accession)) +
geom_point(size=4) + scale_shape_manual(values=c(0:20)) +
ggtitle(paste0("t-sne. Perplexity = ", 40)) +
theme_Publication()
Joining, by = "sample_accession"

That retina group has a cell-line origin. Abstract for SRP056957.
OK, so perhaps that should be removed from a comprehensive analysis.
What about the RPE outlier group in the lower right? Seems to be an origin thing. Let’s read the abstracts for the two studies in that group.
and
Both of these from a paired experiment where they took retina and RPE/sclera/choroid from post-mortem human eyes.
We see a FEW tissue derived RPE (the triangle group at X2=-5,X1=-15 and the plus group at X2=10, X1=-15) clustering with the cell-line-based RPE. What are these?
Ah, actual fetal RPE. Suggesting that cultured RPE derived from H1/H9 ESCs are fetal-like.
GTEx
OK, so I’ve got 19 studies worth of RNA-seq data. I’d also like to see how these relate to other human tissues. The largest go-to source is the GTEx Portal (http://www.gtexportal.org/home/), where they took tissues from hundreds of post-mortem humans. They have around 7,000 RNA-seq datasets.
I selected tissues with more than 10 female and male samples, which will skip tissues that have few samples and are gender-specific (e.g. uterus, prostate).
gtex %>%
mutate(Tissue=grab_attribute(sample_attribute,'histological type:','\\|\\|')) %>%
mutate(Site=grab_attribute(sample_attribute,'body site:','\\|\\|')) %>%
mutate(Gender=grab_attribute(sample_attribute,'sex:','\\|\\|')) %>%
group_by(Tissue, Site, Gender) %>% summarise(Count=n()) %>% filter(Count>10) %>%
group_by(Tissue, Site) %>% summarise(Count=n()) %>% filter(Count>1) %>% select(Tissue, Site) %>% formattable()
Lots of sub-tissues. Let’s look just by tissue.
gtex %>%
mutate(Tissue=grab_attribute(sample_attribute,'histological type:','\\|\\|')) %>%
mutate(Site=grab_attribute(sample_attribute,'body site:','\\|\\|')) %>%
mutate(Gender=grab_attribute(sample_attribute,'sex:','\\|\\|')) %>%
group_by(Tissue, Site, Gender) %>% summarise(Count=n()) %>% filter(Count>10) %>%
group_by(Tissue, Site) %>% summarise(Count=n()) %>% filter(Count>1) %>% select(Tissue) %>% distinct() %>% formattable()
Let’s make a big t-sne plot with all of the tissues immediately above, RPE, and retina.
plot <- long_tsne_plot %>% left_join(.,core_info) %>% filter(Tissue %in% keepers, perplexity>=14) %>%
ggplot(.,aes(x=X1,y=X2,colour=Tissue,shape=Tissue,frame=perplexity)) +
geom_point(size=4) + scale_shape_manual(values=c(0:20,35:45)) +
ggtitle(paste0("t-sne. Perplexity = ")) +
theme_Publication()
Joining, by = "sample_accession"
gg_animate(plot)
long_tsne_plot %>% left_join(.,core_info) %>% filter(perplexity==35, Tissue %in% keepers) %>%
ggplot(.,aes(x=X1,y=X2,colour=Tissue,shape=Tissue)) +
geom_point(size=4) + scale_shape_manual(values=c(0:20,35:45)) +
ggtitle(paste0("t-sne. Perplexity = ", 40)) +
theme_Publication()
Joining, by = "sample_accession"

We see that, interestingly enough, that retina is rather distinct from the other tissues. RPE is a bit closer, with a subgroup of skin tissue generally near it - they are transformed fibroblasts.
LS0tCnRpdGxlOiAiMDEgdHNuZSBjbHVzdGVyaW5nLWJhc2VkIG92ZXJ2aWV3IG9mIGV5ZSBhbmQgR1RFeCBSTkEtc2VxIGRhdGFzZXRzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCmBgYHtyLCBlY2hvID0gRiwgd2FybmluZyA9IEYsIG1lc3NhZ2UgPSBGfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KFJ0c25lKQpsaWJyYXJ5KGdnYW5pbWF0ZSkKbGlicmFyeShmb3JtYXR0YWJsZSkKc291cmNlKCd+L2dpdC9zY3JpcHRzL3RoZW1lX1B1YmxpY2F0aW9uLlInKQpzb3VyY2UoJ34vZ2l0L3VuaWZpZWRfZ2VuZV9leHByZXNzaW9uL3NjcmlwdHMvcGFyc2Vfc2FtcGxlX2F0dHJpYnV0ZS5SJykKbG9hZCgnfi9naXQvdW5pZmllZF9nZW5lX2V4cHJlc3Npb24vZGF0YS9sZW5ndGhTY2FsZWRUUE1fZXllX2d0ZXguUmRhdGEnKQpsb2FkKCd+L2dpdC91bmlmaWVkX2dlbmVfZXhwcmVzc2lvbi9kYXRhL2dlbmNvZGVfdjI1X2d0Zl9hbm5vdGF0aW9uLlJkYXRhJykKbG9hZCgnfi9naXQvdW5pZmllZF9nZW5lX2V4cHJlc3Npb24vZGF0YS90c25lX3Bsb3R0aW5nXzVfNTBfcGVycGxleGl0eS5SZGF0YScpCmBgYAoKIyMgRXllIAoxOSB0b3RhbCBub3JtYWwgZXllIFJOQS1zZXEgc3R1ZGllcyBjb2xsZWN0ZWQKYGBge3J9CmNvcmVfZXllX2luZm8gJT4lIGdyb3VwX2J5KHN0dWR5X2FjY2Vzc2lvbiwgc3R1ZHlfdGl0bGUpICU+JSBzdW1tYXJpc2UoQ291bnQgPSBuKCkpICU+JSBucm93KCkgCmBgYApCYXNpYyB0YWJ1bGFyIGluZm8gb24gdGhlIGNvbGxlY3RlZCBleWUgUk5BLXNlcSBkYXRhCgpgYGB7cn0KIyBFeWUgUk5BLXNlcSBzdHVkaWVzIHdpdGggdGhlIG51bWJlciBvZiBzYW1wbGVzCmNvcmVfZXllX2luZm8gJT4lIGdyb3VwX2J5KHN0dWR5X2FjY2Vzc2lvbiwgc3R1ZHlfdGl0bGUpICU+JSBzdW1tYXJpc2UoQ291bnQgPSBuKCkpICU+JSBmb3JtYXR0YWJsZSgpCiMgTnVtYmVyIG9mIFJQRSwgUmV0aW5hLCBDb3JuZWEsIGV0Yy4gdGlzc3VlcywgYnkgc291cmNlIChUaXNzdWUgb3IgQ2VsbCBMaW5lKQpjb3JlX2V5ZV9pbmZvICU+JSBncm91cF9ieShUaXNzdWUsIE9yaWdpbikgJT4lIHN1bW1hcmlzZShDb3VudD1uKCkpICU+JSBmb3JtYXR0YWJsZSgpCmBgYAoKSSB3YW50IHRvIHNlZSB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRoZSB0aXNzdWVzLiBJIGV4cGVjdCB0byBzZWUgcmV0aW5hIGFuZCBSUEUgYXMgZGlzdGluY3QgY2x1c3RlcnMgb2YgdGlzc3Vlcy4gQ3VyaW91cyBhYm91dCB3aGVyZSB0aGUgY29ybmVhLCBleWVsaWQsIGFuZCBFU0NzIChlbWJyeW9uaWMgc3RlbSBjZWxscykgZW5kIHVwLiBUbyBqdWRnZSB0aGUgc3RhYmlsaXR5IG9mIHRoZSBjbHVzdGVyaW5nLCBJJ3ZlIHJ1biB0aHJvdWdoIHBlcnBsZXhpdGllcyA1IHRvIDUwLiAKClBlcnBsZXhpdHkgNSB0aHJvdWdoIDUwCmBgYHtyfQpleWVfb25seSA8LSBjKCdSZXRpbmEnLCdSUEUnLCdDb3JuZWEnLCdFU0MnLCdFeWVMaWQnLCdDb3JuZWEnKQpwbG90IDwtIGxvbmdfdHNuZV9wbG90ICU+JSBsZWZ0X2pvaW4oLixjb3JlX2luZm8pICU+JSBmaWx0ZXIoVGlzc3VlICVpbiUgZXllX29ubHkpICU+JQogIGdncGxvdCguLGFlcyh4PVgxLHk9WDIsY29sb3VyPVRpc3N1ZSxzaGFwZT1zdHVkeV9hY2Nlc3Npb24sZnJhbWU9cGVycGxleGl0eSkpICsgCiAgICBnZW9tX3BvaW50KHNpemU9NCkgKyBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzPWMoMDoyMCkpICsKICAgIGdndGl0bGUocGFzdGUwKCJ0LXNuZS4gUGVycGxleGl0eSA9ICIpKSArCiAgICB0aGVtZV9QdWJsaWNhdGlvbigpCmdnX2FuaW1hdGUocGxvdCkKYGBgCgpTbywgcmV0aW5hIGFuZCBSUEUgbGFyZ2VseSBzdGF5IGFwYXJ0LiBUaG91Z2ggZWFjaCBoYXMgbGl0dGxlIG91dGdyb3Vwcy4gRVNDLCBFeWVMaWQsIGFuZCBDb3JuZWEgdGVuZCB0byBiZSB3aXRoIHRoZSBSUEUuIExldCdzIHRyeSB0byBzZWUgd2hhdCBlYWNoIG91dGdyb3VwIGlzLiAKCkp1c3QgcGVycGxleGl0eSA0MDoKYGBge3IsIGZpZy53aWR0aD00LCBmaWcuaGVpZ2h0PTV9CmxvbmdfdHNuZV9wbG90ICU+JSBsZWZ0X2pvaW4oLixjb3JlX2luZm8pICU+JSBmaWx0ZXIocGVycGxleGl0eT09NDAsIFRpc3N1ZSAlaW4lIGV5ZV9vbmx5KSAlPiUKICBnZ3Bsb3QoLixhZXMoeD1YMSx5PVgyLGNvbG91cj1UaXNzdWUsc2hhcGU9c3R1ZHlfYWNjZXNzaW9uKSkgKyAKICAgIGdlb21fcG9pbnQoc2l6ZT00KSArIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXM9YygwOjIwKSkgKwogICAgZ2d0aXRsZShwYXN0ZTAoInQtc25lLiBQZXJwbGV4aXR5ID0gIiwgNDApKSArCiAgICB0aGVtZV9QdWJsaWNhdGlvbigpCmBgYApPSywgbGV0J3MgY29sb3VyIGJ5IHRpc3N1ZSBzb3VyY2UgYW5kIG9ubHkga2VlcCBSZXRpbmEgYW5kIFJQRToKYGBge3IsIGZpZy53aWR0aD00LCBmaWcuaGVpZ2h0PTV9CmxvbmdfdHNuZV9wbG90ICU+JSBsZWZ0X2pvaW4oLixjb3JlX2luZm8pICU+JSBmaWx0ZXIocGVycGxleGl0eT09NDAsIFRpc3N1ZSAlaW4lIGMoJ1JldGluYScsJ1JQRScpKSAlPiUKICBnZ3Bsb3QoLixhZXMoeD1YMSx5PVgyLGNvbG91cj1PcmlnaW4sc2hhcGU9c3R1ZHlfYWNjZXNzaW9uKSkgKyAKICAgIGdlb21fcG9pbnQoc2l6ZT00KSArIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXM9YygwOjIwKSkgKwogICAgZ2d0aXRsZShwYXN0ZTAoInQtc25lLiBQZXJwbGV4aXR5ID0gIiwgNDApKSArCiAgICB0aGVtZV9QdWJsaWNhdGlvbigpCmBgYApUaGF0IHJldGluYSBncm91cCBoYXMgYSBjZWxsLWxpbmUgb3JpZ2luLiBBYnN0cmFjdCBmb3IgU1JQMDU2OTU3LiBgciBleWVfcm5hc2VxX2V4cGVyaW1lbnRzICU+JSBmaWx0ZXIoc3R1ZHlfYWNjZXNzaW9uPT0nU1JQMDU2OTU3JykgJT4lIHNlbGVjdChzdHVkeV9hYnN0cmFjdCkgJT4lIGRpc3RpbmN0KClgCgpPSywgc28gcGVyaGFwcyB0aGF0IHNob3VsZCBiZSByZW1vdmVkIGZyb20gYSBjb21wcmVoZW5zaXZlIGFuYWx5c2lzLiAKCldoYXQgYWJvdXQgdGhlIFJQRSBvdXRsaWVyIGdyb3VwIGluIHRoZSBsb3dlciByaWdodD8gU2VlbXMgdG8gYmUgYW4gb3JpZ2luIHRoaW5nLiBMZXQncyByZWFkIHRoZSBhYnN0cmFjdHMgZm9yIHRoZSB0d28gc3R1ZGllcyBpbiB0aGF0IGdyb3VwLgpgciBleWVfcm5hc2VxX2V4cGVyaW1lbnRzICU+JSBmaWx0ZXIoc3R1ZHlfYWNjZXNzaW9uPT0nU1JQMDM0ODc1JykgJT4lIHNlbGVjdChzdHVkeV9hYnN0cmFjdCkgJT4lIGRpc3RpbmN0KClgIGFuZCBgciBleWVfcm5hc2VxX2V4cGVyaW1lbnRzICU+JSBmaWx0ZXIoc3R1ZHlfYWNjZXNzaW9uPT0nU1JQMDgwODg2JykgJT4lIHNlbGVjdChzdHVkeV9hYnN0cmFjdCkgJT4lIGRpc3RpbmN0KClgCgpCb3RoIG9mIHRoZXNlIGZyb20gYSBwYWlyZWQgZXhwZXJpbWVudCB3aGVyZSB0aGV5IHRvb2sgcmV0aW5hIGFuZCBSUEUvc2NsZXJhL2Nob3JvaWQgZnJvbSBwb3N0LW1vcnRlbSBodW1hbiBleWVzLiAKCldlIHNlZSBhIEZFVyB0aXNzdWUgZGVyaXZlZCBSUEUgKHRoZSB0cmlhbmdsZSBncm91cCBhdCBYMj0tNSxYMT0tMTUgYW5kIHRoZSBwbHVzIGdyb3VwIGF0IFgyPTEwLCBYMT0tMTUpIGNsdXN0ZXJpbmcgd2l0aCB0aGUgY2VsbC1saW5lLWJhc2VkIFJQRS4gV2hhdCBhcmUgdGhlc2U/IApgciBleWVfcm5hc2VxX2V4cGVyaW1lbnRzICU+JSBmaWx0ZXIoc3R1ZHlfYWNjZXNzaW9uPT0nU1JQMDExODk1JykgJT4lIG11dGF0ZShTb3VyY2U9Z3JhYl9hdHRyaWJ1dGUoc2FtcGxlX2F0dHJpYnV0ZSwnb3JpZ2VuJywnXFx8XFx8JykpICU+JSBzZWxlY3QoU291cmNlKSAlPiUgZGlzdGluY3QoKWAKYHIgZXllX3JuYXNlcV9leHBlcmltZW50cyAlPiUgZmlsdGVyKHN0dWR5X2FjY2Vzc2lvbj09J1NSUDAxMjU4NScpICU+JSBzZWxlY3Qoc2FtcGxlX2F0dHJpYnV0ZSkgJT4lIGRpc3RpbmN0KClgCgpBaCwgYWN0dWFsIGZldGFsIFJQRS4gU3VnZ2VzdGluZyB0aGF0IGN1bHR1cmVkIFJQRSBkZXJpdmVkIGZyb20gSDEvSDkgRVNDcyBhcmUgZmV0YWwtbGlrZS4gCgojIyBHVEV4CgpPSywgc28gSSd2ZSBnb3QgMTkgc3R1ZGllcyB3b3J0aCBvZiBSTkEtc2VxIGRhdGEuIEknZCBhbHNvIGxpa2UgdG8gc2VlIGhvdyB0aGVzZSByZWxhdGUgdG8gb3RoZXIgaHVtYW4gdGlzc3Vlcy4gVGhlIGxhcmdlc3QgZ28tdG8gc291cmNlIGlzIHRoZSBHVEV4IFBvcnRhbCAoaHR0cDovL3d3dy5ndGV4cG9ydGFsLm9yZy9ob21lLyksIHdoZXJlIHRoZXkgdG9vayB0aXNzdWVzIGZyb20gaHVuZHJlZHMgb2YgcG9zdC1tb3J0ZW0gaHVtYW5zLiBUaGV5IGhhdmUgYXJvdW5kIDxiPjcsMDAwPC9iPiBSTkEtc2VxIGRhdGFzZXRzLiAKCkkgc2VsZWN0ZWQgdGlzc3VlcyB3aXRoIG1vcmUgdGhhbiAxMCBmZW1hbGUgYW5kIG1hbGUgc2FtcGxlcywgd2hpY2ggd2lsbCBza2lwIHRpc3N1ZXMgdGhhdCBoYXZlIGZldyBzYW1wbGVzIGFuZCBhcmUgZ2VuZGVyLXNwZWNpZmljIChlLmcuIHV0ZXJ1cywgcHJvc3RhdGUpLgoKYGBge3J9Cmd0ZXggJT4lIAogIG11dGF0ZShUaXNzdWU9Z3JhYl9hdHRyaWJ1dGUoc2FtcGxlX2F0dHJpYnV0ZSwnaGlzdG9sb2dpY2FsIHR5cGU6JywnXFx8XFx8JykpICU+JSAKICBtdXRhdGUoU2l0ZT1ncmFiX2F0dHJpYnV0ZShzYW1wbGVfYXR0cmlidXRlLCdib2R5IHNpdGU6JywnXFx8XFx8JykpICU+JSAKICBtdXRhdGUoR2VuZGVyPWdyYWJfYXR0cmlidXRlKHNhbXBsZV9hdHRyaWJ1dGUsJ3NleDonLCdcXHxcXHwnKSkgJT4lIAogIGdyb3VwX2J5KFRpc3N1ZSwgU2l0ZSwgR2VuZGVyKSAlPiUgc3VtbWFyaXNlKENvdW50PW4oKSkgJT4lIGZpbHRlcihDb3VudD4xMCkgJT4lIAogIGdyb3VwX2J5KFRpc3N1ZSwgU2l0ZSkgJT4lIHN1bW1hcmlzZShDb3VudD1uKCkpICU+JSBmaWx0ZXIoQ291bnQ+MSkgJT4lIHNlbGVjdChUaXNzdWUsIFNpdGUpICU+JSBmb3JtYXR0YWJsZSgpCmBgYAoKTG90cyBvZiBzdWItdGlzc3Vlcy4gTGV0J3MgbG9vayBqdXN0IGJ5IHRpc3N1ZS4KYGBge3J9Cmd0ZXggJT4lIAogIG11dGF0ZShUaXNzdWU9Z3JhYl9hdHRyaWJ1dGUoc2FtcGxlX2F0dHJpYnV0ZSwnaGlzdG9sb2dpY2FsIHR5cGU6JywnXFx8XFx8JykpICU+JSAKICBtdXRhdGUoU2l0ZT1ncmFiX2F0dHJpYnV0ZShzYW1wbGVfYXR0cmlidXRlLCdib2R5IHNpdGU6JywnXFx8XFx8JykpICU+JSAKICBtdXRhdGUoR2VuZGVyPWdyYWJfYXR0cmlidXRlKHNhbXBsZV9hdHRyaWJ1dGUsJ3NleDonLCdcXHxcXHwnKSkgJT4lIAogIGdyb3VwX2J5KFRpc3N1ZSwgU2l0ZSwgR2VuZGVyKSAlPiUgc3VtbWFyaXNlKENvdW50PW4oKSkgJT4lIGZpbHRlcihDb3VudD4xMCkgJT4lIAogIGdyb3VwX2J5KFRpc3N1ZSwgU2l0ZSkgJT4lIHN1bW1hcmlzZShDb3VudD1uKCkpICU+JSBmaWx0ZXIoQ291bnQ+MSkgJT4lIHNlbGVjdChUaXNzdWUpICU+JSBkaXN0aW5jdCgpICU+JSBmb3JtYXR0YWJsZSgpCmBgYAoKTGV0J3MgbWFrZSBhIGJpZyB0LXNuZSBwbG90IHdpdGggPGI+YWxsPC9iPiBvZiB0aGUgdGlzc3VlcyBpbW1lZGlhdGVseSBhYm92ZSwgUlBFLCBhbmQgcmV0aW5hLiAKCmBgYHtyfQpwbG90IDwtIGxvbmdfdHNuZV9wbG90ICU+JSBsZWZ0X2pvaW4oLixjb3JlX2luZm8pICU+JSBmaWx0ZXIoVGlzc3VlICVpbiUga2VlcGVycywgcGVycGxleGl0eT49MTQpICU+JQogIGdncGxvdCguLGFlcyh4PVgxLHk9WDIsY29sb3VyPVRpc3N1ZSxzaGFwZT1UaXNzdWUsZnJhbWU9cGVycGxleGl0eSkpICsgCiAgICBnZW9tX3BvaW50KHNpemU9NCkgKyBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzPWMoMDoyMCwzNTo0NSkpICsKICAgIGdndGl0bGUocGFzdGUwKCJ0LXNuZS4gUGVycGxleGl0eSA9ICIpKSArCiAgICB0aGVtZV9QdWJsaWNhdGlvbigpCmdnX2FuaW1hdGUocGxvdCkKYGBgCgpgYGB7ciwgZmlnLndpZHRoPTQsIGZpZy5oZWlnaHQ9NX0KbG9uZ190c25lX3Bsb3QgJT4lIGxlZnRfam9pbiguLGNvcmVfaW5mbykgJT4lIGZpbHRlcihwZXJwbGV4aXR5PT0zNSwgVGlzc3VlICVpbiUga2VlcGVycykgJT4lCiAgZ2dwbG90KC4sYWVzKHg9WDEseT1YMixjb2xvdXI9VGlzc3VlLHNoYXBlPVRpc3N1ZSkpICsgCiAgICBnZW9tX3BvaW50KHNpemU9NCkgKyBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzPWMoMDoyMCwzNTo0NSkpICsKICAgIGdndGl0bGUocGFzdGUwKCJ0LXNuZS4gUGVycGxleGl0eSA9ICIsIDQwKSkgKwogICAgdGhlbWVfUHVibGljYXRpb24oKQpgYGAKCldlIHNlZSB0aGF0LCBpbnRlcmVzdGluZ2x5IGVub3VnaCwgdGhhdCByZXRpbmEgaXMgcmF0aGVyIGRpc3RpbmN0IGZyb20gdGhlIG90aGVyIHRpc3N1ZXMuIFJQRSBpcyBhIGJpdCBjbG9zZXIsIHdpdGggYSBzdWJncm91cCBvZiBza2luIHRpc3N1ZSBnZW5lcmFsbHkgbmVhciBpdCAtIHRoZXkgYXJlIHRyYW5zZm9ybWVkIGZpYnJvYmxhc3RzLiAK